package com.tedu.dao;

import com.tedu.pojo.News;
import com.tedu.pojo.Topic;
import com.tedu.utill.JDBCUtill;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * 封装对数据的增删改查 操作
 * 传入sql  返回结果
 * 1.使用Java的反射机制。  自己学习一下Java的反射机制
 */
public class BaseDao {

    /**
     * 对数据库做增删改  操作
     * @param sql  ?占位符
     * @param objects  与占位符  一一对应
     * @return
     */
    public int update(String sql,Object... objects){
        try{
            //加载驱动，获取连接
            Connection connection = JDBCUtill.getConnection();
            //预编译sql
            PreparedStatement preS = JDBCUtill.getPreS(connection,sql);
            //添加参数
            for (int i = 0; i < objects.length; i++) {
                preS.setObject(i+1,objects[i]);
            }
            //执行更新
            int update = JDBCUtill.update(preS);
            JDBCUtill.close(null,preS,connection);
            return update;
        }catch (Exception e){
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 查询  返回实体类类  属性名  必须与  数据库中表的字段一一对应。。（顺序不重要）
     * @param sql
     * @param objects
     * @return 查询集合，实体类类型
     */
    public <T> List<T> query(Class<T> t,String sql,Object... objects){
        try{
            //加载驱动，获取连接
            Connection connection = JDBCUtill.getConnection();
            //预编译sql
            PreparedStatement preS = JDBCUtill.getPreS(connection,sql);
            //添加参数
            for (int i = 0; i < objects.length; i++) {
                preS.setObject(i+1,objects[i]);
            }
            //执行查询
            ResultSet resultSet = JDBCUtill.getResultSet(preS);
            //解析
            List<T> data = new ArrayList<T>();
            while (resultSet.next()){
                // 使用反射  创建一个实体类对象
//                新建实例时，执行无参构造
//                Object obj = c.newInstance();
                T tobj = t.newInstance();
                //通过反射得到字段 == 实体类属性
                Field[] declaredFields = t.getDeclaredFields();
                for (int i = 0; i < declaredFields.length; i++) {
                    //属性
                    Field declaredField = declaredFields[i];
                    String name = declaredField.getName();
                    //通过字段取值
                    Object object = resultSet.getObject(name);
                    //赋值给实体类的属性
                    declaredField.setAccessible(true);
                    //修改
                    declaredField.set(tobj,object);
                }
                //添加到集合
                data.add(tobj);
            }
            JDBCUtill.close(resultSet,preS,connection);

            return data;

        }catch (Exception e){
            e.printStackTrace();
            return new ArrayList<T>();
        }
    }





    public static void main(String[] args) {
        //测试
        BaseDao baseDao = new BaseDao();

        List<Topic> query = baseDao.query(Topic.class, "SELECT * FROM topic");

        System.out.println(query);

        List<News> query1 = baseDao.query(News.class, "SELECT * FROM news");
        System.out.println(query1);
    }

}
